<?php

namespace common\components;
use Yii;
use backend\modules\admin\models\Menu;
use backend\modules\admin\models\RolePriv;
use yii\helpers\Url;
class BaseModule extends \yii\base\Module
{
    public function beforeAction($action){

        if(!parent::beforeAction($action)){
            return false;
        }

        //权限判断：需要完善区分应用；暂时只适用后台部分；
        //需要优化到缓存(未做)
        //当前访问地址->是否免验证->是否登录状态->是否超级管理组->是否存在导航记录中->是否公用->当前角色是否有权限

        $cur['m'] = $action->controller->module->id; //'admin';//当前模块
        $cur['c'] = $action->controller->id; // 当前控制器
        $cur['a'] = $action->id; //当前方法
        $url = '/'.$cur['m'].'/'.$cur['c'].'/'.$cur['a'];
        $open_arr = ['/admin/login/login','wxlogin'];//不需要验证的部分

        if(in_array($url,$open_arr)) return true;

        if((isset(Yii::$app->session['adminuser']) && Yii::$app->session['adminuser'])){//登录状态

            if(in_array(Yii::$app->session['adminuser']['roleid'],[1])) return true;//超级管理组，无需验证


            $param =Yii::$app->getRequest()->queryString;// tools::getUrlParam($cur_url);//当前域名参数
            $menu = Menu::find()->where($cur)->select('m,c,a,data,iscommon')->all();

            //初始化判断数据
            $flag = 0;//标识符，0不存在该导航。1存在该导航
            $m_iscommon = 1;//是否公用的导航，1是，免权限检查。0否，需要验证权限
            $m_data = '';//附加参数

            if($menu){//存在mca
                foreach($menu as $m){
                    $has_param = $m->data?strpos($param,$m->data):0;
                    if($has_param===0 || $has_param>0){
                        $flag = 1;
                        $m_iscommon = $m->iscommon;//获取是否公用
                        $m_data = $m->data;//附加参数
                        break;//结束循环
                    }
                }
            }
            if(!$flag){//不存在该导航，需要增加该记录
                echo '<center>不存在该记录，请检查导航表</center>';exit();
            }

            if($m_iscommon){//公用导航，无需验证权限
                return true;
            }else{//非公用导航，需要查找权限表
                $where['roleid'] = Yii::$app->session['adminuser']['roleid'];//角色条件
                if($m_data) $where['data'] = $m_data;//有附加参数则附加条件
                $priv = RolePriv::find()->where($cur)->andWhere($where)->count();
                if($priv) return true;//有该权限

                echo '<center>您无权限操作</center>';exit();
            }
        }

        //未登录，跳转到登录地址
        header("Location:".Url::toRoute('/admin/login/login'));
    }
}